package com.example.stujava.module.xiangxue.proxy.run_proxy;

import com.example.stujava.module.xiangxue.proxy.static_proxy.Api;
import com.example.stujava.module.xiangxue.proxy.static_proxy.ApiImpl;
import com.example.stujava.module.xiangxue.proxy.static_proxy.ApiProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUsage {
    public static void main(String[] args) {
        //静态代理
        Api api = new ApiImpl();
        ApiProxy apiProxy = new ApiProxy(api);
        apiProxy.addData("");
        //动态代理
        MyImpl impl = new MyImpl();
        //只能代理接口
        //newProxyInstance 生成代理对象class
        Object o = Proxy.newProxyInstance(ProxyUsage.class.getClassLoader(), new Class[]{IWash.class, Api.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //在代理对象上执行方法回调到这里
                System.out.println("");
                //执行真实对象的方法覆
                return method.invoke(impl, args);
            }
        });
        ((IWash) o).wash();
        ((Api) o).updateData();
        //动态代理生成类
    }

    private static void proxy() {
//        IWash.class.getName();
//        sun.misc.ProxyGenerato
    }
}
